/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Database.DBConnection;
import Database.PropertiesManager;
import Model.Endereco;
import Model.Espaco;
import Model.Recurso;
import Model.TipoEspaco;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author 0433101
 */
public class EspacoDAO {
    private static HashMap dados;
    
    static{
        try{
    dados = new PropertiesManager("sql.properties").readPropertiesFile();
        } catch (IOException ioe){
            System.out.println(ioe);
        }
    }
    
    public static boolean inserir(int id_endereco, int capacidade, int id_tipo_espaco, String descricao, int num_espaco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
              
               
        if(capacidade < 0 || id_tipo_espaco < 0 || num_espaco < 0 || id_endereco < 0){
            return false;
        }
        
        //pesquisar endereco;
        Endereco end = EnderecoDAO.pesquisarById(id_endereco);
        if(end == null){
            return false;
        }
        //criar tipoEspaco
        TipoEspaco tipo = TipoEspacoDAO.pesquisarById(id_tipo_espaco);
        if(tipo == null){
            return false;
        }
        
        Espaco e = PesquisarByNumEndereco(num_espaco, id_endereco);
        if(e != null){
            return false;
        }
        
        Espaco espaco = new Espaco();
        espaco.setNum_espaco(num_espaco);
        espaco.setCapacidade(capacidade);
        espaco.setTipo(tipo);
        espaco.setDescricao(descricao);
        espaco.setEnd(end);
        
        String sql = loadSQL("Insert.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        
        pstmt.setInt(1, espaco.getEnd().getId_endereco());
        pstmt.setInt(2, espaco.getCapacidade());
        pstmt.setInt(3, espaco.getTipo().getId());
        pstmt.setString(4, espaco.getDescricao());
        pstmt.setInt(5, espaco.getNum_espaco());      


        pstmt.executeUpdate(); // tbm funciona com pstmt.execute();
        return true;
    } 
    
    public static boolean editar(int id_espaco, int id_endereco, int capacidade, int id_tipo_espaco, String descricao, int num_espaco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
                
        if(capacidade < 0 || id_tipo_espaco < 0 || num_espaco < 0 || id_endereco < 0){
            return false;
        }     
        
        //pesquisar endereco
        Endereco end = EnderecoDAO.pesquisarById(id_endereco);
        if(end == null){
            return false;
        }
        TipoEspaco tipo = TipoEspacoDAO.pesquisarById(id_tipo_espaco);
        if(tipo == null){
            return false;
        }
        Espaco espaco = new Espaco();
        espaco.setId_espaco(id_espaco);
        espaco.setEnd(end);
        espaco.setCapacidade(capacidade);
        espaco.setTipo(tipo);
        espaco.setDescricao(descricao);
        espaco.setNum_espaco(num_espaco);
        
        String sql = loadSQL("Update.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        
        pstmt.setInt(1, espaco.getEnd().getId_endereco());
        pstmt.setInt(2, espaco.getCapacidade());
        pstmt.setInt(3, espaco.getTipo().getId());
        pstmt.setString(4, espaco.getDescricao());
        pstmt.setInt(5, espaco.getNum_espaco());    
        pstmt.setInt(6, espaco.getId_espaco());


        pstmt.executeUpdate(); // tbm funciona com pstmt.execute();
        return true;
    } 
    
    public static Espaco PesquisarById(int id_espaco) throws SQLException, ClassNotFoundException, IOException {
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectById.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_espaco);
        ResultSet rs = pstmt.executeQuery();
        Espaco espaco = null;
        if(rs.next()){
            int num_espaco = rs.getInt("NUM_ESPACO");
            int id_endereco = rs.getInt("ID_ENDERECO");
            int capacidade = rs.getInt("CAPACIDADE");
            int tipo_espaco = rs.getInt("ID_TIPO_ESPACO");
            String descricao = rs.getString("DESCRICAO");
            
            ArrayList<Recurso> recursos = EspacoRecursoDAO.recursosEspaco(id_espaco);
            //pesquisar endereco
            Endereco end = EnderecoDAO.pesquisarById(id_endereco);
            
            TipoEspaco tipo = TipoEspacoDAO.pesquisarById(tipo_espaco);
            
            espaco = new Espaco();
            espaco.setId_espaco(id_espaco);
            espaco.setNum_espaco(num_espaco);
            espaco.setEnd(end);
            espaco.setCapacidade(capacidade);
            espaco.setTipo(tipo);
            espaco.setDescricao(descricao);
            espaco.setRecursos(recursos);
        }
        return espaco;
    }
    
    public static Espaco PesquisarByNumEndereco(int num_espaco, int id_endereco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByNumEndereco.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, num_espaco);
        pstmt.setInt(2, id_endereco);
        ResultSet rs = pstmt.executeQuery();
        Espaco espaco = null;
        if(rs.next()){
            int id_espaco = rs.getInt("ID_ESPACO");
            int capacidade = rs.getInt("CAPACIDADE");
            int tipo_espaco = rs.getInt("ID_TIPO_ESPACO");
            String descricao = rs.getString("DESCRICAO");
            
            ArrayList<Recurso> recursos = EspacoRecursoDAO.recursosEspaco(id_espaco);
            //pesquisar endereco
            Endereco end = EnderecoDAO.pesquisarById(id_endereco);
            
            TipoEspaco tipo = TipoEspacoDAO.pesquisarById(tipo_espaco);
            
            espaco = new Espaco();
            espaco.setId_espaco(id_espaco);
            espaco.setCapacidade(capacidade);
            espaco.setDescricao(descricao);
            espaco.setEnd(end);
            espaco.setTipo(tipo);
            espaco.setNum_espaco(num_espaco);
            espaco.setRecursos(recursos);
        }
        return espaco;
    }
    
    public static ArrayList<Espaco> PesquisarByNum(int num_espaco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByNum.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, num_espaco);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Espaco> espacos = new ArrayList<Espaco>();
        while(rs.next()){
            int id_espaco = rs.getInt("ID_ESPACO");
            int capacidade = rs.getInt("CAPACIDADE");
            int tipo_espaco = rs.getInt("ID_TIPO_ESPACO");
            String descricao = rs.getString("DESCRICAO");
            int id_endereco = rs.getInt("ID_ENDERECO");
            
            ArrayList<Recurso> recursos = EspacoRecursoDAO.recursosEspaco(id_espaco);
            //pesquisar endereco
            Endereco end = EnderecoDAO.pesquisarById(id_endereco);
            
            TipoEspaco tipo = TipoEspacoDAO.pesquisarById(tipo_espaco);
            
            Espaco espaco = new Espaco();
            espaco.setCapacidade(capacidade);
            espaco.setDescricao(descricao);
            espaco.setEnd(end);
            espaco.setId_espaco(id_espaco);
            espaco.setTipo(tipo);
            espaco.setNum_espaco(num_espaco);
            espaco.setRecursos(recursos);
            espacos.add(espaco);
        }
        if(espacos.isEmpty()){
            espacos = null;
        }
        
        return espacos;
    }
    
    public static ArrayList<Espaco> PesquisarByEndereco(int id_endereco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByEndereco.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_endereco);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Espaco> espacos = new ArrayList<Espaco>();
        while(rs.next()){
            int id_espaco = rs.getInt("ID_ESPACO");
            int capacidade = rs.getInt("CAPACIDADE");
            int tipo_espaco = rs.getInt("ID_TIPO_ESPACO");
            String descricao = rs.getString("DESCRICAO");
            int num_espaco = rs.getInt("NUM_ESPACO");
            
            ArrayList<Recurso> recursos = EspacoRecursoDAO.recursosEspaco(id_espaco);
            //pesquisar endereco
            Endereco end = EnderecoDAO.pesquisarById(id_endereco);
            
            TipoEspaco tipo = TipoEspacoDAO.pesquisarById(tipo_espaco);
            
            Espaco espaco = new Espaco();
            espaco.setCapacidade(capacidade);
            espaco.setDescricao(descricao);
            espaco.setEnd(end);
            espaco.setId_espaco(id_espaco);
            espaco.setTipo(tipo);
            espaco.setNum_espaco(num_espaco);
            espaco.setRecursos(recursos);
            espacos.add(espaco);
        }
        if(espacos.isEmpty()){
            espacos = null;
        }
        
        return espacos;
    }
    
    public static ArrayList<Espaco> Pesquisar() throws SQLException, ClassNotFoundException, IOException {
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("Select.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Espaco> espacos = new ArrayList<Espaco>();
        while(rs.next()){
            int id_espaco = rs.getInt("ID_ESPACO");
            int capacidade = rs.getInt("CAPACIDADE");
            int tipo_espaco = rs.getInt("ID_TIPO_ESPACO");
            String descricao = rs.getString("DESCRICAO");
            int num_espaco = rs.getInt("NUM_ESPACO");
            int id_endereco = rs.getInt("ID_ENDERECO");
            
            ArrayList<Recurso> recursos = EspacoRecursoDAO.recursosEspaco(id_espaco);
            //pesquisar endereco
            Endereco end = EnderecoDAO.pesquisarById(id_endereco);
            
            TipoEspaco tipo = TipoEspacoDAO.pesquisarById(tipo_espaco);
            
            Espaco espaco = new Espaco();
            espaco.setCapacidade(capacidade);
            espaco.setDescricao(descricao);
            espaco.setEnd(end);
            espaco.setId_espaco(id_espaco);
            espaco.setTipo(tipo);
            espaco.setNum_espaco(num_espaco);
            espaco.setRecursos(recursos);
            espacos.add(espaco);
        }
        if(espacos.isEmpty()){
            espacos = null;
        }
        
        return espacos;
    }
    
    public static boolean remove(int id_espaco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        EspacoRecursoDAO.removerEspaco(id_espaco);       
        
        String sql = loadSQL("Delete.Espaco");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_espaco);
        pstmt.execute();
        
        return true;
    }
    
    private static String loadSQL(String key){
        String sql=null;
        sql = (String) dados.get(key);
        return sql;
    }
}
